/**
 * Copyright ©2003~2019年1月27日 szkingdom
 * @author raohj
 * @date 2019年1月27日
 * @file RRedisBlog.java
 * @comment : please input your comment to this file
 * @version : input version
 * @modify:
 * 		1、 2019年1月27日 由 raohj 新建文件
 */
package com.ccnu.demojava.nosql.redis;

import redis.clients.jedis.Jedis;

import java.util.*;

/**
 * @author raohj
 * @date 2019年1月27日
 * @version 
 * @comment to add your comment
 */
public class RRedisBlog {
	private Jedis jds;
	
	private static final String PUBLISH_TIME_SET = "TIME_ZSET";
	private static final String SCORE_SET = "SCORE_ZSET";
	private static final String VOTED_SET = "VOTED_SET";
	private static final int VOTE_SCORE = 430;

	/**
	 * @param jds
	 */
	public RRedisBlog(Jedis jds) {
		super();
		this.jds = jds;
	}
	
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment 添加一篇文章
	 * @param 
	 * @return 
	 * @param article
	 * @return
	 */
	public boolean addArticle(RArticle article) {
		// 添加文章到Hash表中
		Long ret = jds.hset(article.getId(), RArticle2Map(article));
		if(ret != 1 && ret != 0) {
			return false;
		}
		
		// 添加文章更新时间到zset中
		ret = jds.zadd(PUBLISH_TIME_SET, article.getTime(), article.getId());
		if(ret != 1 && ret != 0) {
			return false;
		}
		// 设置到文章的总评分到zset中
		ret = jds.zadd(SCORE_SET, article.getTime(), article.getId());
		if(ret != 1 && ret != 0) {
			return false;
		}
		return true;
	}
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment 给文章增加点赞数
	 * @param 
	 * @return 
	 * @param articleID
	 * @return
	 */
	public boolean addVote(String articleID, String userID) {
		if(!jds.sismember(VOTED_SET, userID)) {
			// 增加文章的投票数
			jds.hincrBy(articleID, "votes", 1);
			jds.sadd(VOTED_SET, userID);
			jds.zincrby(SCORE_SET, VOTE_SCORE, articleID);
		}
		return true;
	}
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment 按照时间进行排名
	 * @param 
	 * @return 
	 * @param tops
	 * @return
	 */
	public List<RArticle> getTopByTime(int tops) {
		Set<String> articleIds = (Set<String>) jds.zrevrange(PUBLISH_TIME_SET, 0, tops-1);
		return getArticlesById(articleIds);
	}
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment 按照时间和投票数综合排名
	 * @param 
	 * @return 
	 * @param tops
	 * @return
	 */
	public List<RArticle> getTopByScore(int tops) {
		Set<String> articleIds = (Set<String>) jds.zrevrange(SCORE_SET, 0, tops-1);
		return getArticlesById(articleIds);
	}
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment 根据文章Id，获得文章
	 * @param 
	 * @return 
	 * @param artIds
	 * @return
	 */
	private List<RArticle> getArticlesById(Set<String> artIds){
		List<RArticle> articles = new ArrayList<>();
		for (String artId : artIds) {
			articles.add(getArticleById(artId));
		}
		return articles;
	}
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment 根据ID获取文章属性
	 * @param 
	 * @return 
	 * @param artId
	 * @return
	 */
	private RArticle getArticleById(String artId) {
		return map2RArticle(jds.hgetAll(artId));
	}
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment Map转RArticle对象
	 * @param 
	 * @return 
	 * @param artMaps
	 * @return
	 */
	private RArticle map2RArticle(Map<String, String> artMaps) {
		RArticle art = new RArticle();
		art.setId(artMaps.get("id"));
		art.setTitle(artMaps.get("title"));
		art.setLink(artMaps.get("link"));
		art.setPoster(artMaps.get("poster"));
		art.setTime(Long.valueOf(artMaps.get("time")));
		art.setVotes(Integer.valueOf(artMaps.get("votes")));
		return art;
	}
	
	/**
	 * @author raohj
	 * @date 2019年1月27日
	 * @comment article 转 Map
	 * @param 
	 * @return 
	 * @param article
	 * @return
	 */
	private Map<String, String> RArticle2Map(RArticle article) {
		Map<String, String> artMap = new HashMap<>();
		artMap.put("id", article.getId());
		artMap.put("title", article.getTitle());
		artMap.put("link", article.getLink());
		artMap.put("poster", article.getPoster());
		artMap.put("time", String.valueOf(article.getTime()));
		artMap.put("votes", String.valueOf(article.getVotes()));
		return artMap;
	}
}
